package jvm.c_028_FalseSharing;

import java.util.Random;

/*
* 硬件层缓存数据一致性协议很多

intel 用MESI协议（代表每个CPU的缓存中每个缓存行（cache line）标记四种状态Modified、Exclusive、Shared、Invalid）

https://www.cnblogs.com/z00377750/p/9180644.html

现代CPU的数据一致性实现 = 缓存锁(MESI ...) + 总线锁(有些无法被缓存的数据或者跨越多个缓存行的数据依然必须使用总线锁)
*
*

读取缓存以cache line为基本单位，目前64bytes

位于同一缓存行的两个不同数据，被两个不同CPU锁定，产生互相影响的伪共享问题

伪共享问题：JUC/c_028_FalseSharing

使用（缓存行对齐）能够提高效率（填充多余的字节，在多线程的情况下，不和其他数据混在同一个缓存行里）
*
* */

public class T01_CacheLinePadding {
    private static class T {
        public volatile long x = 0L;
    }

    public static T[] arr = new T[2];

    static {
        arr[0] = new T();
        arr[1] = new T();
    }

    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(()->{
            for (long i = 0; i < 1000_0000L; i++) {
                arr[0].x = i;
            }
        });

        Thread t2 = new Thread(()->{
            for (long i = 0; i < 1000_0000L; i++) {
                arr[1].x = i;
            }
        });

        final long start = System.nanoTime();
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println((System.nanoTime() - start)/100_0000);
    }
}
